题目及测试
package pid118;
/*帕斯卡三角形
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
*/
import java.util.List;
public class main {
public static void main(String[] args) {
int[] testTable = {7,1,5,3,6,4};
for (int ito : testTable) {
test(ito);
}
}
private static void test(int ito) {
Solution solution = new Solution();
List<List<Integer>> rtn;
long begin = System.currentTimeMillis();
System.out.print(ito+" ");
System.out.println();
//开始时打印数组
rtn = solution.generate(ito);//执行程序
long end = System.currentTimeMillis();
//System.out.println(ito + ": rtn=" + rtn);
System.out.println( " rtn=" );
for (int i = 0; i < rtn.size(); i++) {
List<Integer> now=rtn.get(i);
for(int j=0;j<now.size();j++){
System.out.print(now.get(j)+" ");
}
System.out.println();
}//打印结果几数组
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,1ms,超快)
每行首部加1,然后加入 上一行的get(j-1)+get(j)
然后到中间,取同一行之前的数
package pid118;
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<List<Integer>> generate(int numRows) {
if(numRows==0){
List<List<Integer>> result=new ArrayList<>();
return result;
}
if(numRows==1){
List<List<Integer>> result=new ArrayList<>();
List<Integer> now=new ArrayList<>();
now.add(1);
result.add(now);
return result;
}
if(numRows==2){
List<List<Integer>> result=new ArrayList<>();
List<Integer> now=new ArrayList<>();
now.add(1);
result.add(now);
now=new ArrayList<>();
now.add(1);
now.add(1);
result.add(now);
return result;
}
List<List<Integer>> result=new ArrayList<>();
List<Integer> now=new ArrayList<>();
List<Integer> prev;
now.add(1);
result.add(now);
now=new ArrayList<>();
now.add(1);
now.add(1);
result.add(now);
prev=now;
for(int i=3;i<numRows+1;i++){
now=new ArrayList<>();
now.add(1);
int mid=i>>>1;
for(int j=1;j<mid+1;j++){
now.add(prev.get(j-1)+prev.get(j));
}
for(int j=mid+1;j<i;j++){
now.add(now.get(i-j-1));
}
result.add(now);
prev=now;
}
return result;
}
}
解法2(别人的)
与我的类似,只是全部用上一行的数据
每一行的首元素和尾元素均为1,并且它们在上一行没有对应的左上方或右上方元素,故我们应该单独处理,对于中间的元素,就只需要获得它的左上方的元素和右上方的元素之和即可。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list_All = new ArrayList<List<Integer>>();
if(numRows<1){
return list_All; }
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list_All.add(list1);
for(int i=2;i<=numRows;i++){
List<Integer> list = new ArrayList<Integer>();
list.add(1);
List<Integer> list_pre = list_All.get(i-2);
for(int j=1;j<i-1;j++) {
list.add(list_pre.get(j-1)+list_pre.get(j)); }
list.add(1);
list_All.add(list); }
return list_All; } }